package org.flint.data.structure.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * @author flint92
 */
public class UniqueMorseCodeWords {

    /**
     * International Morse Code defines a standard encoding where each letter is mapped to a series of dots and dashes,
     * as follows: "a" maps to ".-", "b" maps to "-...", "c" maps to "-.-.", and so on.
     * <p>
     * For convenience, the full table for the 26 letters of the English alphabet is given below:
     * <p>
     * [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.",
     * "...","-","..-","...-",".--","-..-","-.--","--.."]
     * <p>
     * Now, given a list of words, each word can be written as a concatenation of the Morse code of each letter.
     * For example, "cba" can be written as "-.-..--...", (which is the concatenation "-.-." + "-..." + ".-").
     * We'll call such a concatenation, the transformation of a word.
     * <p>
     * Return the number of different transformations among all words we have.
     * <p>
     * Example:
     * Input: words = ["gin", "zen", "gig", "msg"]
     * Output: 2
     * Explanation:
     * The transformation of each word is:
     * "gin" -> "--...-."
     * "zen" -> "--...-."
     * "gig" -> "--...--."
     * "msg" -> "--...--."
     * <p>
     * There are 2 different transformations, "--...-." and "--...--.".
     * Note:
     * <p>
     * The length of words will be at most 100.
     * Each words[i] will have length in range [1, 12].
     * words[i] will only consist of lowercase letters.
     *
     * @param words 单词集合
     * @return 数字
     */
    public int uniqueMorseRepresentations(String[] words) {
        if (words == null || words.length == 0) {
            return 0;
        }
        Set<String> set = new HashSet<>();
        for (String word : words) {
            set.add(getCode(word));
        }
        return set.size();
    }

    private String getCode(String word) {
        char[] chars = word.toCharArray();
        final StringBuilder sb = new StringBuilder();
        for (char c : chars) {
            sb.append(codes[c - 'a']);
        }
        return sb.toString();
    }

    private final String[] codes =
            {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---",
                    ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};

}
